package main

import "fmt"

func main() {
	/*
				channel, 通道
			“不要通过共享内存通信，而是通过通信来共享内存”
			1.定义：
			（1）chan dataType：没有初始化，值为 nil，没有任何意义
			（2）make(chan dataType)：创建一个无缓冲的通道
			（3）make(chan dataType, 10)：创建一个有 10 个缓冲的通道

			2.len()：代表没有被读取的元素的个数
			  cap()：整个通道的容量

			3.有缓冲的通道：用于通信

			  无缓冲的通道：（1）用于通信
		      			 （2）用于两个goroutine 的同步
						 len = 0, cap = 0

			4.使用无缓冲的通道来实现 goroutine 之间的同步等待

			5.goroutine 运行结束后退出，写到缓冲通道中的数据不会消失，它可以缓冲和适配两个 goroutine 处理速率不一致的情况，有削峰和增大吞吐量的功能

			6.操作不同状态的 chan 会引发三种行为：
			（1）panic：
					A: 向已关闭的通道写数据
					B: 重复关闭操作
			（2）阻塞：
					A: 向未初始化的通道 写数据 / 读数据（未初始化的通道：nil channel，通过var声明的没有初始化的通道）
					B: 向缓冲区已满的通道 写入数据
					C: 通道中没有数据，读取该通道
			（3）非阻塞：
					A: 读取已关闭的通道 ——> 不阻塞，会立即返回通道元素类型的零值
						可以通过 comma, ok 语句判断通道是否已经关闭，未关闭：ok = true; 已关闭：ok = false, comma = 类型零值
					B: 向有缓冲且没有满的通道 读 / 写
	*/
	var a chan int              //仅仅是声明了通道，还不能使用，需要去创建
	fmt.Printf("%T,%v\n", a, a) //chan int,<nil>

	if a == nil {
		fmt.Println("channel是nil的，不能使用，需要先创建通道。。")
		a = make(chan int)
		fmt.Println(a) //0xc00006e060，说明了通道是一个引用类型的数据
	}
	test11(a)
}

func test11(ch chan int) {
	fmt.Printf("%T,%v\n", ch, ch) //chan int,0xc00006e060
}
